import Vue from 'vue'
import axios from 'axios'
import VueAxios from 'vue-axios'

Vue.use(VueAxios, axios)

// 导入封装的回调函数
import { globels, callbacks } from '../../configs/setting.js'

// 动态设置本地和线上接口域名
Vue.axios.defaults.baseURL = globels.host

/**
 * 封装axios的通用请求
 * @param  {string}   type      get或post
 * @param  {string}   url       请求的接口URL
 * @param  {object}   data      传的参数，没有则传空对象
 * @param  {Function} fn        回调函数
 * @param  {boolean}   nonCarryToken 是否需要携带token参数，为true，不需要；false，需要。一般除了登录，都需要
 */
var ajax = function(type, url, data, fn, {
    nonCarryToken,
    errFn,
    host,
    headers,
    axios_opts
} = {}) {

    var options = {
        method: type,
        url: host || url,
        headers: headers && typeof headers === 'object' ? headers : {}
    }

    //检测接口权限
    var api_flag = true
        // if (options.url && options.url.indexOf(globels.host) && this.$store.state.user.userinfo.access_status === 1) {
        //     var url = options.url.replace(globels.host, '');
        //     var api_routers = this.$store.state.user.userinfo.api_routers;
        //     if (!api_routers || !api_routers.constructor === Object || !api_routers[url]) {
        //         api_flag = false;
        //     }
        // }

    if (api_flag === true) {
        options[type === 'get' ? 'params' : 'data'] = data

        // 分发显示加载样式任务
        //this.$store.dispatch('show_loading');

        if (nonCarryToken !== true) {
            options.headers.token = this.$store.state.user.userInfo.token
        }

        //axios内置属性均可写在这里
        if (axios_opts && typeof axios_opts === 'object') {
            for (var f in axios_opts) {
                options[f] = axios_opts[f]
            }
        }
        //发送请求
        Vue.axios(options).then(
            (res) => {
                console.log(res)
                if (res.status === 200) {
                    if (options.method == 'post') {
                        if (res.data.Result) {
                            fn(res.data)
                        } else if (res.data.ForceToLogin) {
                            this.$alert(res.data.Msg, '错误', {
                                confirmButtonText: '确定',
                                type: 'warning'
                            }).then(
                                this.$router.push('/login')
                            )
                        } else {
                            callbacks.requestFail.call(this, res.data);
                            errFn && errFn.call(this)
                        }
                    } else {
                        if (res.data.ForceToLogin) {
                            this.$alert(res.data.Msg, '错误', {
                                confirmButtonText: '确定',
                                type: 'warning'
                            }).then(
                                this.$router.push('/login')
                            )
                        } else {
                            fn(res.data)
                        }

                    }
                } else {
                    // 调用全局配置错误回调
                    callbacks.requestError.call(this, res.data);
                    if (nonCarryToken === true) {
                        errFn && errFn.call(this)
                    }

                }
            }).catch((err) => {
            callbacks.requestError.call(this, err)
            errFn && errFn.call(this)
        })
    } else {
        this.$alert('您没用权限请求该接口！', '请求错误', {
            confirmButtonText: '确定',
            type: 'warning'
        })
    }
}

export { ajax }